#ifndef AER_VIEW3D_HPP_
#define AER_VIEW3D_HPP_

#include "../aerDefs.hpp"


namespace aer {

/// + ~ + ~ ~ + ~ ~ + ~ ~ + ~ ~ + ~ ~ + ~
///
/// Abstract class describing a location in 
/// the 3D space
///
/// + ~ + ~ ~ + ~ ~ + ~ ~ + ~ ~ + ~ ~ + ~
struct Position3D
{
  virtual void setPosition(const Vector3&)    = 0;
  virtual const Vector3& getPosition() const  = 0;
};

/// + ~ + ~ ~ + ~ ~ + ~ ~ + ~ ~ + ~ ~ + ~
///
/// Abstract class describing a view point
/// in the 3D space
///
/// + ~ + ~ ~ + ~ ~ + ~ ~ + ~ ~ + ~ ~ + ~
struct View3D : public Position3D
{
  virtual void setTarget(const Vector3& target)       = 0;
  virtual void setDirection(const Vector3& direction) = 0;
  
  virtual const Vector3& getDirection() const = 0;
  virtual const Vector3& getUp()        const = 0;
  
  virtual const Matrix4x4& getViewMatrix() = 0;
};

} // aer

#endif // AER_VIEW3D_HPP_
